
\chapter{Introdução}
\label{c:introducao}

No século XX, o mundo presenciou imensos avanços na ciência e no modo
como entendemos as máquinas, avanços que mudaram o então presente e marcaram o
futuro como sendo uma era de extremo desenvolvimento tecnológico. Em torno de
1902, já existiam máquinas que trabalhavam com cartões perfurados, as
precursoras do que em 1940 começou a ser chamado de computador (PIGUET, 1995).
Desde então, vimos que a eletrônica vem evoluindo com uma constância incrível,
modificando a natureza dessas máquinas.

Hoje em dia, sistemas computacionais fazem parte do cotidiano de virtualmente
todas as pessoas. Direta ou indiretamente, interagimos ou dependemos de
dispositivos digitais, controlados por microprocessadores. Dependemos dos seus
componentes de hardware e de software para realizar tarefas essenciais. Como
exemplo disto temos sistemas de controle de tráfego, gerenciamento de rede
elétrica, computadores, celulares, etc. O estudo do projeto e desenvolvimento de
sistemas computacionais é um assunto muito abrangente, envolvendo diversas
disciplinas da Ciência da Computação. Envolve áreas de pesquisa bem
estabelecidas, cujos resultados são empregados quase imediatamente no mercado
mundial. As grandes empresas multinacionais, com seus interesses comerciais,
forçam a pesquisa em direção ao estudo de soluções para problemas reais da
atualidade. Os resultados da academia tem o potencial de otimizarem algum
aspecto da produção de um produto comercial, trazendo maiores lucros para a
empresa. A maioria desses sistemas recebe a denominação de \emph{sistema
embarcado}. Trata-se de um sistema computacional embutido em um dispositivo
eletrônico, apresentando restrições severas de eficiência, tamanho e consumo, de
modo a ser uma opção viável comercialmente. Um dos componentes que é
projetado sob essas restrições é o \emph{processador}.

O processador é o componente central de qualquer sistema computacional,
agregando os componentes físicos responsáveis pela execução da lógica do
sistema, propriamente dita, em forma de software. Os atributos desses sistemas,
tais como tamanho, eficiência e consumo de energia, precisam ser cuidadosamente
considerados no projeto de um sistema embarcado, analisando-se a interação deles
com os requisitos originais do sistema. Em geral, processadores para sistemas
embarcados não podem ser tão complexos como os processadores de uso geral
comumente utilizados em computadores de mesa, além de ter que apresentar um
custo competitivo. 

Neste âmbito de processadores para sistemas embarcados, existem diversas
opções de microprocessadores largamente utilizados no mercado. Devido a
multitude de aplicações deste tipo de sistema, e ao contrário do
que é observado no mundo dos computadores pessoais, que é dominado pelos
processadores x86, diversos modelos de arquitetura básica são utilizados, com
destaque a arquiteturas RISC, de propósito mais geral, e as arquiteturas SIMD e
VLIW, com um nicho em aplicações de processamento digital de sinais e/ou
processamento paralelo de dados com alto desempenho. 

\abrv[VLIW -- Very Large Instruction Word]
\abrv[RISC -- Reduced Instruction Set Computer]

Os processadores baseados em arquiteturas RISC são uma presença dominante.
Exemplos deles são: o SparcV8 \cite{sparcv8}, o MIPS32 \cite{mips32} e a
família de processadores ARM \cite{arm}. Uma alternativa nacional, nesta
categoria, foi criada por \citeonline{risco_tese}, denominada \emph{RISCO}.
Trata-se de um processador RISC simples e eficiente, capaz de competir com
outras opções comerciais na sua faixa de preço devido ao seu custo-benefício.
Apesar da sua maturidade, o processador RISCO ainda apresentava uma deficiência
comum aos projetos que nascem no mundo acadêmico: a falta de ferramentas
completas e robustas, com qualidade para competir no mercado, que dêem suporte
ao desenvolvimento de software em linguagens de alto nível. A existência desse
suporte apresentaria inúmeras vantagens: facilitaria o aprendizado da
arquitetura para os estudantes, facilitaria o desenvolvimento de software para
este processador e ainda permitiria que os mais diversos softwares para sistemas
embarcados, por exemplo um sistema operacional de tempo real, fossem modificados
e portados para uma nova arquitetura que utilize o RISCO.

Este trabalho visa apresentar os detalhes da concepção, do projeto, do
desenvolvimento e dos testes de um conjunto de ferramentas que possibilitam a
compilação de software nas linguagens C \cite{c} e C++ \cite{c++} tendo como
alvo o processador RISCO, e com o objetivo de gerar código otimizado com relação
às restrições comuns para sistemas embarcados. Além disso, é apresentada uma
ferramenta de análise estática específica ao código de máquina RISCO, com
funcionalidades para verificação de custos de instruções em termos de blocos
básicos e análise de tempo de execução para o pior caso. Discutimos as opções
que foram consideradas para o rumo do desenvolvimento das ferramentas, as
dificuldades encontradas para a sua conclusão e os resultados obtidos.


\section{Organização do documento}

O restante deste trabalho está organizado da forma que segue. O capítulo
\ref{c:sistemas_embarcados} trata de definir e apresentar o conceito
de sistema embarcado, com diversos exemplos e aspectos que são relativos ao
trabalho, e também uma visão geral do papel do software nesses sistemas. Em
seguida, no capítulo \ref{c:risco}, apresentamos uma descrição do projeto
do processador RISCO e uma discussão breve da motivação por trás do
desenvolvimento deste trabalho voltado especificamente para este processador, e
da necessidade destas ferramentas.

O capítulo \ref{c:plataforma_base} é o primeiro que apresenta ferramentas
desenvolvidas no trabalho. Elas constituem a plataforma base para a compilação e
execução de software escrito na linguagem de montagem do RISCO. 

\abrv[LLVM -- Low Level Virtual Machine]

O capítulo \ref{c:llvm} apresenta o projeto LLVM do ponto de vista dos
desenvolvedores de tecnologia para compiladores. É abordado o seu surgimento
recente, seu prestígio e importância atuais, as vantagens e desvantagens da sua
utilização no contexto deste trabalho, o detalhamento dos seus módulos e como
eles interagem. A linguagem intermediária utilizada no LLVM, que será o foco
principal do desenvolvimento do módulo RISCO, é tratada no capítulo
\ref{c:risco_llvm}.
  
O capítulo \ref{c:analise_codigo} apresenta uma discussão em torno do código
gerado a partir do módulo RISCO-LLVM, tal como manipular certas
características do código através de opções do compilador. Além disso,
é detalhada a ferramenta de análise estática RISCO-CFG. Finalmente, no capítulo
\ref{c:consideracoes}, algumas conclusões sobre o trabalho são delineadas, e
são apontadas possíveis direções para trabalhos futuros.
